<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
  <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
  <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
  <div id="root"></div>
  <script>
    
  </script>
  <script type="text/babel">
    class Child extends React.Component {
      constructor(props) {
        super(props);
        this.state = {}
      }

      // 除了shouldComponentUpdate，其他在render函数之前的所有函数（componentWillMount，componentWillReceiveProps，componentWillUpdate）都被getDerivedStateFromProps替代。
      // React v16.4后
      // getDerivedStateFromProps无论是Mounting还是Updating，也无论是因为什么引起的Updating，全部都会被调用
      // 在组件创建时和更新时的render方法之前调用，它应该返回一个对象来更新状态，或者返回null来不更新任何内容。
      // 必须定义constructor()否则报错
      static getDerivedStateFromProps(props, state) {
        console.log('getDerivedStateFromProps');
        return null;
      }
      // getSnapshotBeforeUpdate() 被调用于render之后，可以读取但无法使用DOM的时候。它使您的组件可以在可能更改之前从DOM捕获一些信息（例如滚动位置）。此生命周期返回的任何值都将作为参数传递给componentDidUpdate（）
      // 必须同时定义componentDidUpdate()
      // Warning: Child: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). This component defines getSnapshotBeforeUpdate() only.
      getSnapshotBeforeUpdate(prevProps, prevState) {
        console.log('getSnapshotBeforeUpdate');
      }

      componentDidUpdate() {

      }

      render() {
        return (
          <p>child</p>
        )
      }
    }

    class Parent extends React.Component {

      

      render() {
        return (
          <div>
            <p>parent</p>
            <Child />
          </div>
        )
      }
    }

    class App extends React.Component {
      render() {
        return (
          <div className="app">
            <p>app</p>
            <Parent />
          </div>
        )
      }
    }

    ReactDOM.render(
      <App />,
      document.querySelector('#root')
    )

  </script>

</body>
</html>